//
//  NetworkTools.swift
//  Weibo
//
//  Created by 郑克哥哥 on 2017/7/25.
//  Copyright © 2017年 郑克哥哥. All rights reserved.
//

import UIKit

import AFNetworking

enum RequestType {
    
    case get
    
    case post
}

//创健网络请求工具类
class NetworkTools:AFHTTPSessionManager{
    
    //单例的全局访问点
    static let sharedTools: NetworkTools = {
        
        let tools = NetworkTools()
        
        //添加可接受的 服务端数据类型
        tools.responseSerializer.acceptableContentTypes?.insert("text/html")
        
        return tools
    }()
    
    //fileprivate:只能在当前文件中访问
    //封装GET和POST请求
    fileprivate func request(type:RequestType,urlStr:String,params:Any?,finishCallBack:@escaping ((Any?,Error?)->())){
        if type == .get{
            self.get(urlStr, parameters: params, progress: nil, success: { (_, response:Any?) in
                finishCallBack(response, nil)
            }, failure: { (_, error:Error) in
                finishCallBack(nil, error)
            })
        }else{
            
            self.post(urlStr, parameters: params, progress: nil, success: { (_, response) in
                finishCallBack(response, nil)
            }, failure: { (_, error) in
                finishCallBack(nil, error)
            })
        }
        
        
    }
    
    
}
//MARK: -------OAuth授权相关接口-------
extension NetworkTools{
    
    /*
     
     必选	类型及范围	说明
     client_id	true	string	申请应用时分配的AppKey。
     client_secret	true	string	申请应用时分配的AppSecret。
     grant_type	true	string	请求的类型，填写authorization_code
     
     grant_type为authorization_code时
     必选	类型及范围	说明
     code	true	string	调用authorize获得的code值。
     redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
     */

    
    //获取令牌
    func requestAccessToken(code:String,callBack:@escaping ((Any?, Error?) -> ())) {
        
        //接口地址
        let urlStr = "https://api.weibo.com/oauth2/access_token"
        
        //接口参数
        let params = [
            "client_id":appKey,
            "client_secret":AppSecret,
            "grant_type":"authorization_code",
            "code":code,
            "redirect_uri":redirect_uri
        ]
        
        //加载网络请求
        request(type: .post, urlStr: urlStr, params: params, finishCallBack: callBack)
    }
    
    /*
     必选	类型及范围	说明
     access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
     uid	false	int64	需要查询的用户ID。
     screen_name	false	string	需要查询的用户昵称。
     */
    
    //获取用户信息
    func requestUserInfo(access_token:String,uid:Int64,callBack:@escaping ((Any?, Error?) -> ())) {
        
        //接口地址
        let urlStr = "https://api.weibo.com/2/users/show.json"
        
        //接口参数
        let params: [String:Any] = [
            "access_token":access_token,
            "uid":uid
        ]
        
        print(urlStr + "?access_token=\(access_token)&uid=\(uid)")
        
        //加载网络请求
        request(type: .get, urlStr: urlStr, params: params, finishCallBack: callBack)
    }
    
    
}

//MARK: -------首页相关接口-------
extension NetworkTools{
    
    /*
     发送文字微博
     access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
     status	true	string	要发布的微博文本内容，必须做URLencode，内容不超过140个汉字。
     */
    func sendWeibo(access_token:String,status:String,callBack:@escaping ((Any?, Error?) -> ()))  {
        //接口地址
        let urlStr = "https://api.weibo.com/2/statuses/update.json"
        //接口参数
        let params = [
            "access_token":access_token,
            "status":status
        ]
        
        //发送网络请求
        request(type: .post, urlStr: urlStr, params: params, finishCallBack: callBack)
    }
    
    //获取登录和所关注的微博用户数据
    func requestStatuses(access_token:String,maxID:Int64 = 0,sinceId: Int64 = 0,callBack:@escaping ((Any?, Error?) -> ())){
       /*
        必选	类型及范围	说明
        access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
        since_id	false	int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
        max_id	false	int64	若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
        count	false	int	单页返回的记录条数，最大不超过100，默认为20。
        page	false	int	返回结果的页码，默认为1。
        base_app	false	int	是否只获取当前应用的数据。0为否（所有数据），1为是（仅当前应用），默认为0。
        feature	false	int	过滤类型ID，0：全部、1：原创、2：图片、3：视频、4：音乐，默认为0。
        trim_user	false	int	返回值中user字段开关，0：返回完整user字段、1：user字段仅返回user_id，默认为0。
        */
        //接口地址
        let urlStr = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        //接口参数
        let params: [String:Any] = [
            "access_token":access_token,
            "max_id":maxID,
            "since_id":sinceId
        ]
        print(urlStr + "?access_token=\(access_token)")
        //加载网络数据
        request(type: .get, urlStr: urlStr, params: params, finishCallBack: callBack)
    }
    
    
}
